home *** CD-ROM | disk | FTP | other *** search
/ PCMania 44 / PCMania CD44_1.iso / pcmania / treal44 / aviles / 3dbasics.bak next >
Text File  |  1996-04-05  |  22KB  |  801 lines

  1. /**********************************************************
  2. *
  3. *Francisco Javier Avilés Navarro
  4. * C/Pisa,4 Plgno.Res. Santa Ana
  5. *    CARTAGENA  30319 (MURCIA)
  6. *
  7. ***********************************************************
  8. *
  9. * Marzo de 1996
  10. *
  11. ***********************************************************
  12. *
  13. * Información acerca de las librerías 3Dbasics y 3DObjects
  14. *
  15. ***********************************************************/
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44. 1.QUE SON 3DBASICS Y 3DOBJECTS.
  45.  
  46.  
  47. 2.FUNCIONES DE 3DBASICS.EJEMPLOS.
  48.  
  49.   2.0 FUNCIONES.
  50.   2.1 EL PROGRAMA 'HOLA'.
  51.   2.2 UN PROGRAMA UN POCO MAS COMPLEJO: CILINDRO.C
  52.   2.3 EJEMPLO DE MOTOR ALTERNATIVO.
  53.   2.4 MAPEADO DE UNA TEXTURA PCX SOBRE UN POLIGONO
  54.   2.5 LECTORES DE FORMATOS GRAFICOS:
  55.  
  56.         2.5.1. LECTOR  PLG.
  57.         2.5.2.   "     ASC.
  58.         2.5.3.   "     INC.
  59.         2.5.4.   "     RAW.
  60.         2.5.5.   "     WRL.
  61.  
  62.  
  63.   2.6 CONVERSOR ENTRE FORMATOS.
  64.   2.7 TODO JUNTO. EL PROGRAMA SHAREWARE 'NAVEGANTE 1.0'
  65.   2.8 FORMATOS Y PRESTACIONES QUE SE QUIEREN INCORPORAR.
  66.   2.9 ADVERTENCIAS PARA EL USO DE LA LIBRERIA
  67.  
  68. 3.FUNCIONES DE 3DOBJECTS.EJEMPLOS.
  69.  
  70.   3.0 FUNCIONES.
  71.   3.1 UN PROGRAMA SENCILLO: SURFAB.CPP,SURFAB.CC .
  72.   3.2 LECTOR DE FORMATO DXF: LECTODXF.CC .
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83. 1.QUE SON 3DBASICS Y 3DOBJECTS.
  84. -------------------------------
  85.  
  86. Son dos librerias en ,C y C++ respectivamente, utilizables en el desarrollo
  87. de aplicaciones 3D y RV no inmersiva.
  88. Entre las principales características de 3DBasics se encuentran:
  89.  
  90.      - Renderización en cualquier modo de 8 bits (por el momento).
  91.      - Mapeado de texturas PCX (por el momento).
  92.      - Sombreados plano y Phong.
  93.      - Hasta 50000 tr/s en sombreado plano y 15000 en Phong
  94.        sobre un DX2 66 Mhz en DOS 32 bits.
  95.      - Luces lejanas,puntuales,... .
  96.      - Multiplataforma. Ha sido testeado sobre DOS 16 bits,
  97.        DOS 32 bits, Windows 3.11, y UNIX (plataformas IBM Risc 6000).
  98.      - Posibilidad de detección de choques entre objetos en tiempo real.
  99.  
  100. Entre las de 3DObjects:
  101.  
  102.      - Creación de objetos en base a la siguiente jerarquía de clases:
  103.  
  104.         punto3d --> conjunto_de_puntos --> conjunto_de_conjunto_de_puntos -> CAPA
  105.            |           |                             |
  106.          Extr.        Extrusión                    Extrusión
  107.          Revo..        Revolución..                     ..
  108.          Extr.n.l.      Extrusión no lineal
  109.                    |                 |
  110.                    |                 |
  111.                    |_____________________________|
  112.                            |
  113.                            |
  114.                       Superficies
  115.                       bicúbicas
  116.  
  117.                       -Abiertas ---- (Bezier,Coons..)
  118.  
  119.                       -Semicerradas -(Tuberías,
  120.  
  121.                       -Cerradas ---- (Elipsoides,...)
  122.  
  123.  
  124.  
  125. 2.FUNCIONES DE 3DBASICS.EJEMPLOS.
  126. ---------------------------------
  127.  
  128.  
  129.  
  130.  
  131.   2.0 FUNCIONES.
  132.  -----------------
  133.  
  134.   Son las básicas en cualquier sistema 3D:
  135.  
  136.  
  137.  
  138.  
  139.   Para crear tetrángulos, que es el elemento básico de 3DBasics, se utiliza
  140.  
  141.   forma_tetrangulo(double p1[3],double p2[3],double p3[3],double p4[3],int color,int s_color,char *textura,struct CUERPO *)
  142.  
  143.   donde p1,p2,p3 y p4 definen obviamente los vértices, color el índice de la paleta utilizado,
  144.   s_color se utiliza para el caso de tetrángulos texturizados (entonces color es el ancho y s_color
  145.   el alto de la textura), textura es la matriz de caracteres que la definen y el puntero a
  146.   CUERPO es el cuerpo al que pertenece el tetrángulo (en 3DBasics los polígonos se organizan
  147.   por conjuntos para formar un cuerpo 3D.)
  148.   Análogamente existen 3 funciones más que son casos particulares del tetrágulo:
  149.   forma_triangulo,forma_recta y forma punto.
  150.   Para operaciones con CUERPOs existen funciones de:
  151.  
  152.            -Rotacion.
  153.            -Traslado.
  154.            -Copia.
  155.            -Copia según espejo.
  156.            -Promediado
  157.  
  158.   Existen además una serie de funciones que, todas juntas, forman un ciclo
  159.   de visualización:
  160.  
  161.            -lookat (visx,visy,visz,mix,miy,miz,twist_angle). Establece
  162.             la matriz de transformación.
  163.            -a_observador() .Que traslada a coordenadas de observador el mundo virtual.
  164.            -a_pantalla_plano(). Proyecta sobre el buffer de pantalla y renderiza con modelo sombreado plano.
  165.            -a_pantalla_phong(). Proyecta sobre el buffer de pantalla y renderiza con modelo sombreado Phong.
  166.            -BitBlt(). Se trae del buffer de pantalla a la pantalla el gráfico.
  167.            -Manage(). Administra el sistema integrando el buffer con una función
  168.             de tratamiento del teclado y el ratón que permite moverse por el
  169.             mundo virtual.
  170.  
  171.    Por fin existen 2 funciones:
  172.  
  173.            - Initialize(int modo, long tam_buffer);
  174.              modo 0 320x200,1 640x400, 2 640x480, 3 800X600,4 1024x768, 5 1280x768
  175.            - cerrar_sistema();
  176.  
  177.    que se deben poner al principio y final del programa para preparar al sistema
  178.    para utilizar a 3Dbasics . modo es la resolución a utilizar y tam_buffer el tamaño
  179.    del buffer de 3Dbasics. Un tamaño típico en DOS 32 bits o Windows 3.1 sería 1Mb con
  180.    lo que se vienen a poder crear sin técnicas especiales del orden de 5000 tetrangulos.
  181.    (10000 triangulos).
  182.    Para modelos más grandes (se ha llegado a experimentar con modelos de 400000 triángulos)
  183.    se recomienda el tener 16 Mb de RAM aunque en determinados casos, siempre que se cumplan
  184.    una serie de condiciones y se utilice una técnica especial se puede llegar al medio millón
  185.    con 8Mb ). Con menos memoria el sistema también puede renderizar esas cantidades pero la
  186.    velocidad cae drásticamente al tener que hacer el intercambio de datos con el disco duro
  187.    propio de sistemas protegidos.
  188.    Con este conjunto de funciones,que en total no sobrepasan las 20, se puede hacer prácticamente
  189.    todo lo imaginable.
  190.  
  191.   2.1 El programa HOLA.
  192.   ---------------------
  193.  
  194.   Se va a describir un típico programa que simplemente crea un mundo con
  195.   un tetrángulo y permite moverse en él:
  196.  
  197.   #include "3dbasics.h"
  198.  
  199.  
  200.   main()
  201.   {
  202.  
  203.  
  204.   double p1[3]={0.0,0.0,0.0},
  205.      p2[3]={100.0,0.0,0.0},
  206.      p3[3]={100.0,100.0,0.0},
  207.      p4[3]={0.0,100.0,0.0};
  208.  
  209.   CUERPO HOLA;
  210.  
  211.   /**PUNTO DE VISION*/
  212.   visx=visy=visz=1000;/*PUNTO DESDE DONDE SE MIRA*/
  213.   mix=miy=miz=0;/*PUNTO AL QUE SE MIRA*/
  214.   neary=300;/*DISTANCIA DEL OJO AL PLANO DE CLIP CERCANO.ES NECESARIO SIEMPRE*/
  215.   Initialize(2,1024);//Modo 640 x 480 y 1K para el administrador (realmente necesita menos).
  216.   forma_tetrangulo(p1,p2,p3,p4,93,0,NULL,&HOLA);
  217.   Manage();
  218.   cerrar_sistema();
  219.  
  220.   }
  221.  
  222.  
  223.  
  224.   2.2 UN PROGRAMA UN POCO MAS COMPLEJO: CILINDRO.C
  225.   ------------------------------------------------
  226.  
  227.   #include "3dbasics.h"
  228.  
  229.   double p1[3],p2[3],p3[3],p4[3];
  230.   CUERPO HOLA;
  231.  
  232.   void forma_cilindro(int n,double R,double H)
  233.   {
  234.   /*n es el numero de lados con que se desea aproximar al cilindro el prisma
  235.     que se va a formar, R es el radio y H la altura*/
  236.     double delta_v=(2*3.14159)/(double)n;
  237.     int icl1;
  238.     for (icl1=0;icl1<n;icl1++)
  239.     {
  240.     p1[0]=H;
  241.     p1[1]=R*cos((double)icl1*delta_v);
  242.     p1[2]=R*sin((double)icl1*delta_v);
  243.     p2[0]=H;
  244.     p2[1]=R*cos((double)(icl1+1)*delta_v);
  245.     p2[2]=R*sin((double)(icl1+1)*delta_v);
  246.     p3[0]=0.0;
  247.     p3[1]=R*cos((double)(icl1+1)*delta_v);
  248.     p3[2]=R*sin((double)(icl1+1)*delta_v);
  249.     p4[0]=0.0;
  250.     p4[1]=R*cos((double)icl1*delta_v);
  251.     p4[2]=R*sin((double)icl1*delta_v);
  252.     forma_tetrangulo(p1,p2,p3,p4,93,0,NULL,&HOLA);
  253.     }
  254.   return;
  255.   }
  256.  
  257.   main()
  258.   {
  259.   visx=visy=visz=1000;
  260.   mix=miy=miz=0;
  261.   neary=300;
  262.   Initialize(2,100*1024);//Modo 640 x 480 y 100K para el administrador (realmente necesita menos).
  263.   forma_cilindro(40,100.0,1000.0);
  264.   Manage();
  265.   cerrar_sistema();
  266.   }
  267.  
  268.  
  269.   2.3 EJEMPLO DE MOTOR ALTERNATIVO
  270.   --------------------------------
  271.  
  272. #include "3dbasics.h"
  273. #define R 50
  274. struct triangulo *primero,*segundo,raiz,PISTON1,CIG1,BIELA1,PISTON2;
  275. struct triangulo *TR3,*TR2,*TR1;
  276. struct CUERPO PISTON11,PISTON12,CIG11,B1,EJE;
  277.  
  278.  
  279. void haz_los_pistones()
  280. {
  281. int cl1;
  282. double p1[3],p2[3],p3[3],p4[3];
  283. int pp1[3],pp2[3];
  284. float countador4;
  285.     cl1=0;
  286.       while (cl1<=19)
  287.         {
  288.          countador4=cl1*0.314159;
  289.          p1[0]=180+(R*sin(countador4));
  290.          p1[1]=280;
  291.          p1[2]=180-(R*cos(countador4));
  292.          p2[0]=180+(R*sin(countador4+0.314159));
  293.          p2[1]=280;
  294.          p2[2]=180-(R*cos(countador4+0.314159));
  295.          p3[0]=180+(R*sin(countador4+0.314159));
  296.          p3[1]=380;
  297.          p3[2]=180-(R*cos(countador4+0.314159));
  298.          p4[0]=180+R*sin(countador4);
  299.          p4[1]=380;
  300.          p4[2]=180-(R*cos(countador4));
  301.          forma_tetrangulo(p1,p2,p3,p4,93,0,"s",&PISTON11);
  302.          p1[0]=180+(R*sin(countador4));
  303.          p1[1]=280;
  304.          p1[2]=180-(R*cos(countador4));
  305.          p2[0]=180+(R*sin(countador4+0.314159));
  306.          p2[1]=280;
  307.          p2[2]=180-(R*cos(countador4+0.314159));;
  308.          p3[0]=180;
  309.          p3[1]=280;
  310.          p3[2]=180;
  311.          p4[0]=180;
  312.          p4[1]=280;
  313.          p4[2]=180;
  314.          forma_tetrangulo(p1,p2,p3,p4,93,0,"a",&PISTON11);
  315.          cl1++;
  316.         }
  317. pp1[0]=10;pp1[1]=580;pp1[2]=180;
  318. pp2[0]=400;pp2[1]=580;pp2[2]=180;
  319. trans_copy(&PISTON11,&PISTON12,-80,0,0);
  320. rota_tetrangs(&PISTON12,pp1,pp2,3.14159,1);
  321. }
  322.  
  323. void haz_el_ciguenal()
  324. {
  325. int cl1;
  326. double p1[3],p2[3],p3[3],p4[3],p5[3],p6[3],p7[3],p8[3];
  327. double p9[3],p10[3],p11[3],p12[3],p13[3],p14[3],p15[3],p16[3];
  328. float countador4;
  329. p1[0]=200;
  330. p1[1]=565;
  331. p1[2]=165;
  332. p2[0]=190;
  333. p2[1]=565;
  334. p2[2]=165;
  335. p3[0]=190;
  336. p3[1]=565;
  337. p3[2]=195;
  338. p4[0]=200;
  339. p4[1]=565;
  340. p4[2]=195;
  341. forma_tetrangulo(p1,p2,p3,p4,93,0,"s",&CIG11);
  342. p5[0]=200;
  343. p5[1]=640;
  344. p5[2]=130;
  345. p6[0]=190;
  346. p6[1]=640;
  347. p6[2]=130;
  348. forma_tetrangulo(p5,p6,p2,p1,93,0,"s",&CIG11);
  349. p7[0]=200;
  350. p7[1]=680;
  351. p7[2]=130;
  352. p8[0]=190;
  353. p8[1]=680;
  354. p8[2]=130;
  355. forma_tetrangulo(p7,p8,p6,p5,93,0,"s",&CIG11);
  356. p9[0]=200;
  357. p9[1]=695;
  358. p9[2]=165;
  359. p10[0]=190;
  360. p10[1]=695;
  361. p10[2]=165;
  362. forma_tetrangulo(p9,p10,p8,p7,93,0,"s",&CIG11);
  363. p11[0]=200;
  364. p11[1]=695;
  365. p11[2]=195;
  366. p12[0]=190;
  367. p12[1]=695;
  368. p12[2]=195;
  369. forma_tetrangulo(p11,p12,p10,p9,93,0,"s",&CIG11);
  370. p13[0]=200;
  371. p13[1]=680;
  372. p13[2]=230;
  373. p14[0]=190;
  374. p14[1]=680;
  375. p14[2]=230;
  376. forma_tetrangulo(p13,p14,p12,p11,93,0,"s",&CIG11);
  377. p15[0]=200;
  378. p15[1]=640;
  379. p15[2]=230;
  380. p16[0]=190;
  381. p16[1]=640;
  382. p16[2]=230;
  383. forma_tetrangulo(p15,p16,p14,p13,93,0,"s",&CIG11);
  384. forma_tetrangulo(p4,p3,p16,p15,93,0,"s",&CIG11);
  385. forma_tetrangulo(p1,p5,p15,p4,93,0,"s",&CIG11);
  386. forma_tetrangulo(p5,p7,p13,p15,93,0,"s",&CIG11);
  387. forma_tetrangulo(p7,p9,p11,p13,93,0,"s",&CIG11);
  388. forma_tetrangulo(p12,p14,p8,p10,93,0,"s",&CIG11);
  389. forma_tetrangulo(p14,p16,p6,p8,93,0,"s",&CIG11);
  390. forma_tetrangulo(p16,p3,p2,p6,93,0,"s",&CIG11);
  391. trans_copy(&CIG11,&CIG11,-30,0,0);
  392. trans_copy(&CIG11,&CIG11,-80,0,0);
  393.  while (cl1<=9)
  394.     {
  395.      countador4=cl1*0.628318;
  396.      p1[0]=200;
  397.      p1[1]=660+(12*sin(countador4));
  398.      p1[2]=180-(12*cos(countador4));
  399.      p2[0]=200;
  400.      p2[1]=660+(12*sin(countador4+0.628318));
  401.      p2[2]=180-(12*cos(countador4+0.628318));
  402.      p3[0]=240;
  403.      p3[1]=660+(12*sin(countador4+0.628318));
  404.      p3[2]=180-(12*cos(countador4+0.628318));
  405.      p4[0]=240;
  406.      p4[1]=660+12*sin(countador4);
  407.      p4[2]=180-(12*cos(countador4));
  408.      forma_tetrangulo(p1,p2,p3,p4,93,0,"s",&EJE);
  409.      cl1++;
  410.    }
  411.     cl1=0;
  412.      while (cl1<=9)
  413.         {
  414.          countador4=cl1*0.628318;
  415.          p1[0]=160;
  416.          p1[1]=660+(12*sin(countador4));
  417.          p1[2]=180-(12*cos(countador4));
  418.          p2[0]=160;
  419.          p2[1]=660+(12*sin(countador4+0.628318));
  420.          p2[2]=180-(12*cos(countador4+0.628318));
  421.          p3[0]=120;
  422.          p3[1]=660+(12*sin(countador4+0.628318));
  423.          p3[2]=180-(12*cos(countador4+0.628318));
  424.          p4[0]=120;
  425.          p4[1]=660+12*sin(countador4);
  426.          p4[2]=180-(12*cos(countador4));
  427.          forma_tetrangulo(p1,p2,p3,p4,93,0,"s",&EJE);
  428.          cl1++;
  429.        }
  430.  
  431.  
  432. }
  433.  
  434. void haz_la_biela()
  435. {
  436. int cl1;
  437. double p1[3],p2[3],p3[3],p4[3],p5[3],p6[3],p7[3],p8[3];
  438. double p9[3],p10[3],p11[3],p12[3],p13[3],p14[3],p15[3],p16[3];
  439. double p17[3],p18[3],p19[3],p20[3];
  440. float countador4;
  441. p1[0]=190;
  442. p1[1]=340;
  443. p1[2]=170;
  444. p2[0]=170;
  445. p2[1]=340;
  446. p2[2]=170;
  447. p3[0]=190;
  448. p3[1]=560;
  449. p3[2]=170;
  450. p4[0]=170;
  451. p4[1]=560;
  452. p4[2]=170;
  453. forma_tetrangulo(p1,p2,p3,p4,93,0,"s",&B1);
  454. p5[0]=190;
  455. p5[1]=570;
  456. p5[2]=160;
  457. p6[0]=170;
  458. p6[1]=570;
  459. p6[2]=160;
  460. forma_tetrangulo(p5,p6,p4,p3,93,0,"s",&B1);
  461. p7[0]=190;
  462. p7[1]=590;
  463. p7[2]=160;
  464. p8[0]=170;
  465. p8[1]=590;
  466. p8[2]=160;
  467. forma_tetrangulo(p7,p8,p6,p5,93,0,"s",&B1);
  468. p9[0]=190;
  469. p9[1]=605;
  470. p9[2]=170;
  471. p10[0]=170;
  472. p10[1]=605;
  473. p10[2]=170;
  474. forma_tetrangulo(p9,p10,p8,p7,93,0,"s",&B1);
  475. p11[0]=190;
  476. p11[1]=605;
  477. p11[2]=190;
  478. p12[0]=170;
  479. p12[1]=605;
  480. p12[2]=190;
  481. forma_tetrangulo(p11,p12,p10,p9,93,0,"s",&B1);
  482. p13[0]=190;
  483. p13[1]=590;
  484. p13[2]=200;
  485. p14[0]=170;
  486. p14[1]=590;
  487. p14[2]=200;
  488. forma_tetrangulo(p13,p14,p12,p11,93,0,"s",&B1);
  489. p15[0]=190;
  490. p15[1]=570;
  491. p15[2]=200;
  492. p16[0]=170;
  493. p16[1]=570;
  494. p16[2]=200;
  495. forma_tetrangulo(p15,p16,p14,p13,93,0,"s",&B1);
  496. p17[0]=190;
  497. p17[1]=560;
  498. p17[2]=190;
  499. p18[0]=170;
  500. p18[1]=560;
  501. p18[2]=190;
  502. forma_tetrangulo(p17,p18,p16,p15,93,0,"s",&B1);
  503. p19[0]=190;
  504. p19[1]=340;
  505. p19[2]=190;
  506. p20[0]=170;
  507. p20[1]=340;
  508. p20[2]=190;
  509. forma_tetrangulo(p19,p20,p18,p17,93,0,"s",&B1);
  510. forma_tetrangulo(p1,p3,p17,p19,93,0,"s",&B1);
  511. forma_tetrangulo(p3,p5,p15,p17,93,0,"s",&B1);
  512. forma_tetrangulo(p5,p7,p13,p15,93,0,"s",&B1);
  513. forma_tetrangulo(p7,p9,p11,p13,93,0,"s",&B1);
  514. forma_tetrangulo(p12,p14,p8,p10,93,0,"s",&B1);
  515. forma_tetrangulo(p14,p16,p6,p8,93,0,"s",&B1);
  516. forma_tetrangulo(p16,p18,p4,p6,93,0,"s",&B1);
  517. forma_tetrangulo(p4,p18,p20,p2,93,0,"s",&B1);
  518. }
  519.  
  520.  
  521. main()
  522. {
  523. int cl1=0,cl2,ii,cl3=1,evor=0;
  524. int p1[3],p2[3],p5[3],p6[3];
  525. float p3[3],p4[3];
  526.  
  527. float cfl1,cfl2,t=0.0,cfl3,cfl4;
  528. float v_angular=0.2;
  529. float l_biela=240.0;
  530. float radio_cig=80.0;
  531. float l1_l2;
  532. float centro_giro_cig=660.0;
  533.  
  534.  
  535. Initialize(2,0,0,300000);
  536. haz_los_pistones();
  537. haz_el_ciguenal();
  538. haz_la_biela();
  539. l1_l2=radio_cig/l_biela;
  540. neary=300;/*NEAR CLIP PLANE:¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ESENCIAL!!!!!!!!!!!!!!!!*/
  541. cfl1=centro_giro_cig-(radio_cig*cos(v_angular*t))-(l_biela*sqrt(1-(l1_l2*l1_l2*sin(v_angular*t)*sin(v_angular*t))));
  542. cfl3=-atan2(l1_l2*sin(v_angular*t),sqrt(1-(l1_l2*l1_l2*sin(v_angular*t)*sin(v_angular*t))));
  543. /**pUNTOS DE REFERENCIA PARA LOS GIROS */
  544. p1[0]=10;p1[1]=660;p1[2]=180;
  545. p2[0]=400;p2[1]=660;p2[2]=180;
  546. p3[0]=10;p3[1]=340;p3[2]=180;
  547. p4[0]=400;p4[1]=340;p4[2]=180;
  548. p5[0]=(int)p3[0];
  549. p5[1]=(int)p3[1];
  550. p5[2]=(int)p3[2];
  551. p6[0]=(int)p4[0];
  552. p6[1]=(int)p4[1];
  553. p6[2]=(int)p4[2];
  554. /*LINEA DE VISION*/
  555. visy=660;
  556. visx=1301;
  557. miy=660;
  558. mix=180;
  559. miz=400;
  560. visz=400;
  561. for( ; ; )
  562.     {
  563.     cl2=control_key(1000,1500);
  564.     if (cl2==27){break;}
  565.     else{
  566.     if (cl2==43){cl3=1;}
  567.     if (cl2==45){cl3=0;}
  568.     cl2=0;
  569.     if (cl3==1){
  570.     t+=1.0;
  571.     cfl2=centro_giro_cig-(radio_cig*cos(v_angular*t))-(l_biela*sqrt(1-(l1_l2*l1_l2*sin(v_angular*t)*sin(v_angular*t))));
  572.     cfl4=-atan2(l1_l2*sin(v_angular*t),sqrt(1-(l1_l2*l1_l2*sin(v_angular*t)*sin(v_angular*t))));
  573.     perspective(0,0,300,1400);
  574.     trans_tetrangs(&PISTON11,0,(cfl2-cfl1),0);
  575.     trans_tetrangs(&PISTON12,0,(cfl2-cfl1),0);
  576.     p3[1]+=(cfl2-cfl1);
  577.     p4[1]+=(cfl2-cfl1);
  578.     p5[1]=(int)p3[1];
  579.     p6[1]=(int)p4[1];
  580.     trans_tetrangs(&B1,0,(cfl2-cfl1),0);
  581.     rota_tetrangs(&B1,p5,p6,(cfl4-cfl3),1);
  582.     rota_tetrangs(&CIG11,p1,p2,v_angular,1);
  583.     }
  584.     lookat(visx,visy,visz,mix,miy,miz,0);
  585.     a_observador();
  586.     if (cl3==1){
  587.     promedia_normales(&B1);
  588.     }
  589.     memset(dir,100,DOBLETPANTX*DOBLETPANTY);
  590.     a_pantalla_phong();
  591.     GrBitBlt(NULL,0,70,Donde_dibujo,0,0,DOBLETPANTX,DOBLETPANTY,GrWRITE);
  592.     cfl1=cfl2;
  593.     cfl3=cfl4;
  594.     cl1++;
  595.     }
  596.     evor++;
  597.     };
  598.     cerrar_sistema();
  599.  
  600. }
  601.  
  602.  
  603.  
  604.  
  605.   2.4 MAPEADO DE UNA TEXTURA PCX SOBRE UN POLIGONO
  606.   ------------------------------------------------
  607.  
  608.   Aunque la inclusión de texturas tiene algunos detalles más, para
  609.   poder hacer compatible la paleta de la textura con la del sistema,
  610.   aquí va un pequeño ejemplo que mapea un fichero PCX 'f.pcx' sobre
  611.   un tetrangulo.
  612.  
  613.   #include "3dbasics.h"
  614.  
  615.  
  616.   main()
  617.   {
  618.  
  619.  
  620.   double p1[3]={0.0,0.0,0.0},
  621.      p2[3]={100.0,0.0,0.0},
  622.      p3[3]={100.0,100.0,0.0},
  623.      p4[3]={0.0,100.0,0.0};
  624.  
  625.   CUERPO HOLA;
  626.  
  627.   int ancho,alto,localizador=getPCX("f.pcx",texturasPCX,-1,&ancho,&alto);
  628.  
  629.   /**Toma de la textura*/
  630.  
  631.   /**PUNTO DE VISION*/
  632.   visx=visy=visz=1000;/*PUNTO DESDE DONDE SE MIRA*/
  633.   mix=miy=miz=0;/*PUNTO AL QUE SE MIRA*/
  634.   neary=300;/*DISTANCIA DEL OJO AL PLANO DE CLIP CERCANO.ES NECESARIO SIEMPRE*/
  635.   Initialize(2,1024);//Modo 640 x 480 y 1K para el administrador (realmente necesita menos).
  636.   forma_tetrangulo(p1,p2,p3,p4,ancho,alto,texturasPCX,&HOLA);
  637.   Manage();
  638.   cerrar_sistema();
  639.  
  640.   }
  641.  
  642.  
  643.  
  644.  
  645.   2.5,2.6 y 2.7 .PROGRAMAS CUYOS FUENTES VIENEN CON LA VERSION REGISTRADA.
  646.   ------------------------------------------------------------------------
  647.  
  648.  
  649.  
  650.   2.8 FORMATOS Y PRESTACIONES QUE SE QUIEREN INCORPORAR.
  651.   ------------------------------------------------------
  652.  
  653.  
  654.   Además de  los  formatos que se pueden leer ya, estoy abierto a que se
  655.   me sugiera cualquier otro.
  656.   Por otra  parte, he decidido adoptar el formato WRL (VRML) como el es-
  657.   tandar, pero como adolece de ciertas prestaciones lo voy a extender.
  658.   Quiero  incluirle prestaciones como que en ANCHOR se le puedan incluir
  659.   no solo WRL's, sino cualquiera de los otros formatos. Además sería de-
  660.   seable  incluir  nuevas  primitivas  tales como bicubic_surface o algo
  661.   así.
  662.  
  663.   En cuanto al  motor en sí, en una nueva implementación que estoy empe-
  664.   zando a desarrollar  estoy dirigiendo los esfuerzos a que sea dirigido
  665.   a CUERPOs en vez de  a tetrangulos para poder implementar un mecanismo
  666.   LOD (Level Of Detail) por el cual el nivel de detalle de un cuerpo es-
  667.   té en función de la  distancia  a  que nos encontremos de él (no tiene
  668.   sentido definir y manejar  miles  de  triangulos si sólo va a aparecer
  669.   un punto en la pantalla).  Esto me permitirá además el asociar sonidos
  670.   3D a esos cuerpos.
  671.   Por otra parte voy a implementar  en el motor un mecanismo de visuali-
  672.   zación ZBuffer que espero  no  ralentize en más de un 50% la velocidad
  673.   del motor (incluso  para  grandes  cantidades de triangulos, sombreado
  674.   Phong y texturas puede que sea más rápido). Además de la mejora que su
  675.   pone de por sí el hecho de que no se produzcan errores de profundidad,
  676.   creo que voy a poder implementar un mecanismo de sombreado entre obje-
  677.   tos en tiempo real (20000 triangulos/seg aprox.).
  678.   Una tercera mejora es la inclusión de color de 15 bits en DOS y de  24
  679.   bits en Windows de manera que las texturas puedan dejar de ser  planas
  680.   respecto a la iluminación y puedan ser definidos un mayor número de co
  681.   lores en la paleta del sistema.
  682.  
  683.  
  684.   2.9 ADVERTENCIAS PARA EL USO DE LA LIBRERIA QUE SE ADJUNTA
  685.   ----------------------------------------------------------
  686.  
  687.   1. ES PARA SER UTILIZADA CON GNU C++.
  688.   2. SE INCLUYE UN FICHERO BUILD 'CONGT13.BAT' QUE DEBERA SER MODIFICADO
  689.      CON ARREGLO AL DIRECTORIO DONDE SE COMPILE. YO NORMALMENTE LO
  690.      HAGO EN C:\DJGPP\SAMPLES\HELLO Y POR ELLO TIENE ESTA TRAYECTO-
  691.      RIA.
  692.  
  693.      del %1.
  694.  
  695.      call ..\..\bin\setdjgpp ../.. ..\..
  696.      set TMPDIR=.
  697.      set GO32TMP=.
  698.      set GO32=
  699.  
  700.      echo.
  701.      echo Compiling the test program
  702.      echo.
  703. -----------
  704. TRAYECTORIA --->     ..\..\bin\gcc -v -fomit-frame-pointer %1.c 3dbasics.o -o %1 -lgrx -lm -lc -lpc
  705. -----------
  706.      echo.
  707.      echo Running the test program
  708.      echo.
  709. -----------
  710. TARJETA GRAFICA --|---LA MIA ES UNA CIRRUS LOGIC 5429!!!!!!!!!
  711. -----------      \/
  712.      set go32=driver c:\djgpp\drivers\cl5426.grn
  713.      ..\..\bin\go32 %1
  714.  
  715.      echo .
  716.  
  717.      :exit
  718.  
  719.  
  720.      EL USO DE ESTE FICHERO OBVIAMENTE COMO SE PUEDE VER ES:
  721.  
  722.  
  723.      CONGT13  FICHERO_A_COMPILAR
  724.  
  725.  
  726.  
  727.   Junto a este documento se distribuye el fichero '3dbasics.o' que puede
  728.   ser utilizado para generar programas y demos de forma libre. Las unicas
  729.   limitaciones que tiene son:
  730.    -El modelo de luz es cenital.
  731.    -La cantidad de triangulos que se pueden manejar.
  732.   Sin embargo se permite el sombreado Phong y texturas PCX.
  733.   La cantidad de memoria asignada al buffer interno es de 100000 bytes
  734.   lo que permite aproximadamente unos 1500 triangulos (depende de varios
  735.   factores el numero exacto).
  736.   Se necesita al menos una tarjeta VGA,386 con copro y al menos 2Mb de
  737.   memoria (si no recuerdo mal, aunque esto lo podeis mirar en el FAQ de DJGPP).
  738.  
  739.  
  740.  
  741.   En la versión registrada se pueden tener todos los modelos de luz y:
  742.  
  743.   VERSION DOS (Probado en Turbo C++ 2.0 o superior , Borland C, Power Pack
  744.   (Borland C 32 bits), Microsoft C++ y GNU C++).Ordenador minimo 8088 con VGA
  745.   para las versiones 16 bits.
  746.  
  747.  
  748.   Por 2995pts hasta 1Mb de espacio.
  749.    "  3995      "   2Mb       "
  750.    "  4995      "   4Mb       "
  751.    "  6500      "   8Mb       "
  752.    "  9995      "  32Mb       "
  753.    " 19995     sin limitacion
  754.  
  755.   Los fuentes para ser modificados y distribuidos : CONSULTAR
  756.  
  757.  
  758.   VERSION WINDOWS 3.1x (Clase class Win3d : public TWindow de ObjectWindows 2.x)
  759.  
  760.   Por 4995pts hasta 1Mb de espacio.
  761.    "  6500      "   2Mb       "
  762.    "  7500      "   4Mb       "
  763.    "  8500      "   8Mb       "
  764.    "  12995     "  32Mb       "
  765.  
  766.   Los fuentes para ser modificados y distribuidos : CONSULTAR
  767.  
  768.  
  769.   Visualizadores DOS:
  770.  
  771.            Hasta 1Mb  Hasta 4Mb  Sin limite
  772.  
  773.   PLG+RAW+ASC+INC: 1500 pts    2000 pts    3000 pts
  774.   DXF :            1500 pts    2000 pts    5000 pts
  775.   VRML:            2000 pts    3000 pts    5000 pts
  776.   Conjunto         4000 pts    5500 pts   10000 pts
  777.  
  778.  
  779.   Visualizadores Windows 3.1x:
  780.  
  781.            Hasta 1Mb  Hasta 4Mb  Hasta 16 Mb
  782.  
  783.   PLG+RAW+ASC+INC: 2500 pts    3000 pts    4000 pts
  784.   VRML:            3000 pts    4000 pts    5000 pts
  785.   Conjunto         5000 pts    6000 pts    7000 pts
  786.  
  787.   Todos aquellos que estén interesados en ser betatesters desarrollando ejemplos
  788.   (de los que después me den una copia) que me lo hagan saber en el cupón de
  789.   pedido pues el nivel de precio les baja un escalón (1Mb -> 1995, 2Mb -> 2995, ..)
  790.  
  791.  
  792.   Por otra parte los que querais usar 3dBasics para alguna demo o concurso y me
  793.   lo hagais saber se os bajarán dos niveles (2Mb -> 1995,4Mb ->2995,...) pero debeis
  794.   admitir que salga una pantalla de presentación en la que se haga mención del uso de
  795.   esta librería.
  796.  
  797.   3.0,3.1 y 3.2 VERSION REGISTRADA.
  798.   ---------------------------------
  799.  
  800.  
  801.